package com.chinamsp.dydb.dbsource;

import java.util.HashMap;
import java.util.Map;

import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;

/**
 * 默认的 数据源  属性
 * @author shifenghu
 *
 */
public class DefaultDataSourceProperties {

	
	/**
	 * mysql 默认配置 
	 */
	public static final Map<String, Object> MYSQL = newProperties(
			"max-active","10",
			"initial-size", "2",
			"max-wait", "60",
			"min-idle", "1",
			"time-between-eviction-runs-millis", "60000", // 如果当前连接池中某个连接在空闲了timeBetweenEvictionRunsMillis时间后任然没有使用，则被物理性的关闭掉。
			"min-evictable-idle-time-millis", "300000", // 配置一个连接在池中最小生存的时间，单位是毫秒
			"validation-query", "SELECT COUNT(*) FROM DUAL", // 检查 连接可用性的 sql，必须要有数据返回的SQL语句
			"test-while-idle", "true", // 是否测试 可用，每次 从连接池获取连接时，都会检查可用性，会影响性能
			"test-on-borrow", "false", // 使用testOnBorrow为true（即在获取Connection对象时检测其可用性），不过这样会影响性能
			"test-on-return", "false" // 设置当连接被归还时，是否要提交所有还未完成的事务
			);
	
	
	/**
	 * 合并参数
	 * @param driverClassName
	 * @param properties
	 * @return
	 */
	public static Map<String, Object> merge(String driverClassName, Map<String, Object> properties){
		Assert.notNull(driverClassName, "驱动名称不能为空");
		Map<String, Object> result = new HashMap<>(16);
		// 获取 默认 properties
		if (driverClassName.toLowerCase().contains("mysql")) {
			result.putAll(MYSQL);
			// 使用用户设置的参数覆盖
			if (!CollectionUtils.isEmpty(properties)) {
				result.putAll(properties);
			}
		} else {
			return properties;
		}
		return result;
	}
	
	/**
	 * 初始化  一个 properties
	 * @param strings
	 * @return
	 */
	private static Map<String, Object> newProperties(String... strings){
		if (strings == null || strings.length % 2 != 0) {
			throw new IllegalArgumentException("参数配置错误");
		}
		Map<String, Object> properties = new HashMap<>(strings.length / 2);
		for (int i = 0;i < strings.length / 2;i ++) {
			properties.put(strings[i*2], strings[i*2 + 1]);
		}
		return properties;
	}
}
